
import logging
import traceback

from PySide6.QtCore import Signal, QObject

from 程序核心代码.mvvm重构.基础定义.基础图形项.连接线.连接线模型管理 import 连接线模型管理
from 程序核心代码.mvvm重构.基础定义.节点管理器.动态数据调度器.带状态机的属性管理 import 状态机管理
from 程序核心代码.mvvm重构.基础定义.辅助功能.ast节点解析器 import AST解析器
from 程序核心代码.mvvm重构.基础定义.辅助功能.节点布局 import 有向图布局器

# 配置日志记录器
logging.basicConfig(level=logging.WARNING)  # 设置默认日志级别
日志记录器 = logging.getLogger(__name__)

class 节点模型管理器(状态机管理):
    # 状态： 未解析 解析中(独立线程)解析完成 布局完成（独立线程）
    节点模型准备就绪信号 = Signal()
    注册节点图形项管理器信号 = Signal(object)
    def __init__(self, 创建者节点=None, ast节点=None, 文件名=None):
        super().__init__()
        self.文件名 = 文件名
        self.创建者节点 = 创建者节点
        if 创建者节点 is None:
            self.ast节点 = ast节点
        else:
            self.ast节点 = self.创建者节点._ast节点.body
        self.调试模式 = False
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
        else:
            日志记录器.setLevel(logging.ERROR)  # 只显示警告及以上级别的日志
        日志记录器.debug(f"创建节点模型管理器，创建者节点:{创建者节点}, ast节点:{ast节点}, 文件名:{文件名}")
        self.节点模型列表 = []
        self.节点模型字典 = {}
        self._ast解析器 = AST解析器(self.ast节点, self)
        self.节点布局管理器 = 有向图布局器()
        self.连接线模型管理器=连接线模型管理(self)
        self.连接线模型集合 = self.连接线模型管理器.连接线模型集合
        self.节点图形项管理器=None
        self.注册节点图形项管理器信号.connect(self.注册节点图形项管理器)
        self.设置属性('节点模型准备就绪',False)
        self.注册状态机("节点模型管理器")
        self.注册状态("节点模型管理器", "初始化",      连续状态=True, 前置属性列表=["节点模型管理器初始化状态"], 后置属性列表=["节点模型初始化状态"], 动作=self.初始化节点模型管理器)
        self.注册状态("节点模型管理器", "解析节点模型", 连续状态=True, 前置属性列表=["节点模型初始化状态"], 后置属性列表=[], 动作=self.开始解析节点模型)
        self.注册状态("节点模型管理器", "开始布局",    连续状态=True, 前置属性列表=["节点模型准备就绪"], 后置属性列表=[], 动作=self.自动布局)
        self.设置属性('节点模型管理器初始化状态',True)
        self.获取状态机("节点模型管理器").触发状态("初始化")
    def 初始化节点模型管理器(self):
        日志记录器.debug("初始化节点模型管理器")
        if self.节点图形项管理器:  # 如果已经有节点图形项管理器，则先通知清空
            if self.节点图形项管理器.获取状态机("节点图形项管理器状态机").切换状态("初始化"):
                print("节点图形项管理器状态机切换成功")
            self.节点模型字典 = {}
            self.节点模型列表 = []
        self.设置属性('节点模型准备就绪', False)
        #self.开始解析节点模型()
        return True
    def 注册节点图形项管理器(self, 节点图形项管理器):
        self.节点图形项管理器 = 节点图形项管理器
    def 开始解析节点模型(self):
        日志记录器.debug("开始解析节点模型")
        self._ast解析器.信号.解析完成.connect(self.节点模型解析完成)
        self._ast解析器.开始解析()
        return True
    def 创建连接线模型(self, args, kwargs):
        return self.连接线模型管理器.创建连接线模型(*args, **kwargs)
    def 节点模型解析完成(self):
        #日志记录器.info("节点模型解析完成")
        日志记录器.info(f"节点模型解析完成 节点模型字典:{self.节点模型字典}")
        self.设置属性('节点模型准备就绪',True)  # 理论上 容器节点图形项管理器 状态会被自动触发
        self.获取状态机("节点模型管理器").触发状态("开始布局")
        # 修改状态机状态


    def 自动布局(self):
        日志记录器.debug("开始进行自动布局")
        # 计算所有节点的新布局位置
        self.节点布局管理器.计算布局(布局算法='dot')
        所有节点位置集合 = self.节点布局管理器.获取所有节点位置()
        for 节点ID, 位置 in 所有节点位置集合.items():
            # 先检查节点ID是否在节点字典中
            if 节点ID not in self.节点模型字典:
                日志记录器.warning(f"节点ID {节点ID} 不在节点字典中，无法调整位置")
                continue
            #self.节点模型字典[节点ID].节点位置=位置
            节点模型=self.节点模型字典[节点ID]
            if 节点模型:
                节点模型.节点位置=位置
                日志记录器.debug(f"节点ID {节点ID} 的位置已设置为 {位置}")
            else:
                日志记录器.warning(f"节点ID {节点ID} 的节点模型不存在，无法调整位置")
                traceback.print_exc()
        日志记录器.info("自动布局完成")
